package com.cow.framework.utils.math;

import java.math.BigDecimal;
import java.util.Random;

/**
 * 
 * 数学运算工具类：主要包含加、减、乘、除、精度截取及比大小等功能<br>
 * 此类采用BigDecimal进行基础运算，避免丢失精度以及灵活的控制四舍五入方式<br>
 * 
 * @author tanp2@sany.com.cn
 * @since 2014-10-16
 * @version 1.0
 *
 */
public class MathUtil {

	/**
	 * 
	 * 加(结果默认舍入)
	 * 
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @return 和
	 *
	 */
	public static BigDecimal add(Number d1, Number d2,int scale) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.add(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
		
	}
	

	/**
	 * 
	 * 加（含舍入判断）
	 * 
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @param round 舍入方式（boolean值，true则入，false则舍）
	 * @return 说明入参、返回、异常等
	 */
	public static BigDecimal add(Number d1, Number d2,int scale,boolean round) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.add(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);		
	}

	/**
	 * 
	 * 减（结果默认舍入）
	 * 
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @return 差
	 *
	 */
	public static BigDecimal subtract(Number d1, Number d2,int scale) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.subtract(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 
	 * 减（含舍入判断）
	 * 
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @param round 舍入方式（boolean值，true则入，false则舍）
	 * @return 差
	 *
	 */
	public static BigDecimal subtract(Number d1, Number d2,int scale,boolean round) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.subtract(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
	}

	/**
	 * 除（结果默认舍入）
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @return 商
	 */
	public static BigDecimal divide(Number d1, Number d2, int scale) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 除（含舍入判断）
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @param round 舍入方式（boolean值，true则入，false则舍）
	 * @return 商
	 */
	public static BigDecimal divide(Number d1, Number d2, int scale,boolean round) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.divide(bd2, scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
	}
	
	/**
	 * 乘（结果默认舍入）
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @return 积
	 */
	public static BigDecimal multiply(Number d1, Number d2, int scale) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.multiply(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 乘(含舍入判读)
	 * @param d1 数1
	 * @param d2 数2
	 * @param scale 小数位位数(四舍五入)
	 * @param round 舍入方式（boolean值，true则入，false则舍）
	 * @return 积
	 */
	public static BigDecimal multiply(Number d1, Number d2, int scale,boolean round) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		return bd1.multiply(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
	}
	
	/**
	 * 判断舍入与否后精确到指定位数
	 * @param d1 数1
	 * @param scale 小数位位数(四舍五入)
	 * @param round 舍入方式（boolean值，true则入，false则舍）
	 * @return 舍入数
	 */
	public static BigDecimal round(Number d1, int scale,boolean round) {
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		return bd1.setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
	}
	
	/**
	 * 比较两数大小
	 * @param d1 数1
	 * @param d2 数2
	 * @return 0相等，1则d1大，-1则d2大
	 */
	public static int checkBigger(Number d1,Number d2){
		int result = -1;
		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
		if(bd1.compareTo(bd2)>0){
			result = 1;
		}else if(bd1.compareTo(bd2)==0){
			result = 0;
		}
		return result;
		
	}
	/**获取指定长度随机数*/
	public static String getRandNum(int charCount) {
        String charValue = "";
        for (int i = 0; i < charCount; i++) {
            char c = (char) (randomInt(0, 10) + '0');
            charValue += String.valueOf(c);
        }
        return charValue;
    }
	/**获取指定范围随机数*/
    public static int randomInt(int from, int to) {
        Random r = new Random();
        return from + r.nextInt(to - from);
    }	
    
    /**获取随机字符串*/
    public static String getRandStr(int charCount){
    	StringBuffer randBf = new StringBuffer();
        
        char[] charAndnum = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
        Random random = new Random(); //用于产生随机数
        for (int j = 0; j < charCount; j++) {
        	randBf.append(charAndnum[random.nextInt(62)]);  
        }
        
        return randBf.toString();
    }
    
//	public static void main(String[] args){
//	 System.out.println(getRandStr(8));		
//	}
}
